接下來要介紹SOLID的原則,會一一介紹
今天先從SRP開始
單一職責原則(SRP, Single Responsibility Principle);這很容易讓其他人粗暴地將其理解為每個模組都只做一件事。
先說,對於函式來說確實是只做一件事情,但對於模組則不是。
根據Clean Architecture的說法是這樣的
一個模組應該只對唯一的一個角色負責。
-Clean Architecture(P54)
聽起來是有聽沒有懂對吧
我們直接當背骨仔來違反他看看
舉個案例
假設我今天有一套計算全部學校學生成績的系統
學校有三種學生:a, b, c
實際上這三種學生考試的科目和成績計算方式完全不同(例如某些科目需要加權等等)
但我a, b, c三種學生都依賴同一個底層function來計算最終成績(假設名稱為foo()
)
有一天b種類的學生需要更改成績的計算方式
所以就有某個倒楣鬼去做了修改,但他也沒有注意到它實際上有呼叫到foo()
結果就這樣上線了
直到運作了一陣子才發現成績全部都是錯的
也就是不同角色共用了某個function而導致這個狀況,在不知情的情況下
我們修改了功能,進而導致後面的問題產生
所以我們要怎麼解決這些問題
SRP說: 分開不同角色所依賴的程式碼
-Clean Architecture(P56)
最明顯的方法就是我們去了解每個種類的學生
也就是想辦法把他們三種分開,變成三個可被追蹤的不同個體
套用到程式上就是
實體化不同的類別,使他們不瞭解彼此
這個Controller就只負責某個種類的學生
其他全部與他無關,也不清楚需要做甚麼
Clean Architecture(ch.7)
個人淺見是對模組,對系統也應該有SRP,只是顆粒度大小的問題,比如student的class只負責student的事,訂單模組只關注訂單,email認證系統只負責認證email,…
以上述案例來看,將不同的student包成一包顯然不是個好作法
因為是將 "會考試" 就當作是學生
而忽略了他們的身分不同而有不同科目以及不同的計算方式
至於顆粒度大小的問題,以我個人的淺見來看確實是這樣沒錯
只是這個顆粒要切到多小就真的是一門藝術,很容易有過度設計的問題
上述的案例將student不做區分的做法就不太好
舉個其他例子
企鵝是鳥,但不會飛
如果把企鵝當作是鳥又要求他會飛
就會有點問題對吧
不過最終還是會回到團隊,通常團隊中其他人看過code不太需要解釋就能理解,我想就沒什麼問題
最後是系統的SRP,這部分就可以參考一下微服務架構,微服務架構就是專注於每一個系統就負責單一職責